package ind.csi.simuladorserial;

import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import java.util.TooManyListenersException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.event.EventType;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;

public class SimuladorSerialController implements Initializable {
    
    public static SimuladorSerialController instance;
    private Conecta conecta;
    private String porta;
    private Integer tempo;
    private boolean running = false;
    private Thread t;
    private String texto;
    private String dados;

    @FXML
    private TextField mensagemEnviada;
    @FXML
    public String mensagemRecebida;
    @FXML
    private Label mensagem;
    @FXML
    private Button invisivel;
    @FXML
    private Button btnOK;
    @FXML
    private Button btnSair;
    @FXML
    private Button pararLooping;    
    @FXML
    private CheckBox loop;
    @FXML
    private ScrollPane pane;
    @FXML
    private TextArea textArea;

    @FXML
    private void clickOK(ActionEvent event) {
        
        dados = mensagemEnviada.getText();
        
        if (!mensagemEnviada.getText().equalsIgnoreCase("")) {

            if (loop.isSelected()) {
                if (!running) {
                    dados = mensagemEnviada.getText();
                    mensagem.setText("Enviando dados em loop");
                    running = true;
                    t = new Thread(new Runnable() {

                        @Override
                        public void run() {
                            while (running) {
                                try {
                                    conecta.comunicacaoSerial(dados);
                                    Thread.sleep(tempo);
                                } catch (Exception e) {
                                    mensagem.setText("Erro: " + e.getMessage());
                                    System.out.println(e);
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                    t.start();
                } else {
                    mensagem.setText("Você está com loop ativo, desative para reusar a aplicação");
                }
            } else {
                try {
                    System.out.println(mensagemEnviada.getText().getBytes());
                    conecta.comunicacaoSerial(dados);
                    mensagem.setText("Dados enviado com sucesso");
                } catch (Exception e) {
                    System.out.println("Erro: " + e);
                    e.printStackTrace();
                } finally {
                    mensagemEnviada.setText("");

                }
            }

        } else {
            mensagem.setText("O campo não pode ser vazio");
        }
    }

    /*Recebe parametros amortecedores.ini*/
    public void setParametros(String porta) {
        this.porta = porta;
    }

    public void limparMensagem() {
        mensagem.setText("");
    }

    @FXML
    public void paraLoop() {
        this.loop.setSelected(false);        
        this.running = false;
        t.interrupt();
        this.mensagemEnviada.setText("");
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        getIni();
        conecta = new Conecta(this.porta, this);
        textArea.textProperty().addListener(new ChangeListener<Object>() {
            @Override
            public void changed(ObservableValue<?> observable, Object oldValue,
                    Object newValue) {
                textArea.setScrollTop(Double.MAX_VALUE); //this will scroll to the bottom
                //use Double.MIN_VALUE to scroll to the top
            }
        });
    }//fim initialize()

    /*CONFIG KEYS*/
    @FXML
    private void teclaPressionada(KeyEvent event) {

        switch (event.getCode()) {
            case ENTER:
                btnOK.arm();
                btnOK.fire();
                break;
            case ESCAPE:
                fechar(event);
                break;
        }
    }//teclaPressionada()

    public void fechar(KeyEvent event) {
        Node source = (Node) event.getSource();
        Stage stage = (Stage) source.getScene().getWindow();
        stage.close();
    }

    @FXML
    public void fecharAplicacao() {
        try {
            this.conecta.close();
            System.out.println("Comunicação COM fechada com sucesso!");
        } catch (Exception e) {
            System.out.println(e);
        }
        System.exit(0);
    }

    public void getIni() {
        try {

            FileReader reader = new FileReader("configPort.ini");
            BufferedReader buffer = new BufferedReader(reader);

            String linha = buffer.readLine();

            while (linha != null) {
                if (linha.contains("PORT")) {
                    this.porta = linha.substring(5, linha.length());
                } else if (linha.contains("TIME")) {
                    this.tempo = Integer.parseInt(linha.substring(5, linha.length()));
                }
                linha = buffer.readLine();
            }
            System.out.println("Porta configurada: " + this.porta);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
    
    @FXML
    public void escreverArea(String s){
        System.out.println("Mensagem recebida: " + s);
        textArea.appendText(s+"\n");
    }
    
    public SimuladorSerialController getInstance(){
        return this;
    }
    
}
